﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Web;

namespace SystmicFunction.IRMHelper
{

    /// <summary>
    /// 	传递者，中间者，协调员
    /// 	<![CDATA[Client <=> Server <=> DataSource]]>
    ///     1.弱化Server对Client请求数据处理，
    ///     2.减少Client的连接与资源消耗，
    ///     3.DataSource一次数据录入（永久）保存，
    ///     4.增强Client与DataSource之间的沟通
    ///     
    /// 数据持久化不应该再线程中进行
    /// </summary>
    public class Worker
    {
        public String Key { get; set; }
        public Object Data { get; set; }
        private static readonly Dictionary<String, Object> Dict = new Dictionary<string, object>();

        #region 异步 事件 委托


        public delegate void GetDataCompleted(Object sender, ObjectDataEventArgs e);
        public event GetDataCompleted OnGetDataCompleted;

        public void GetDataAsync()
        {
            OnGetDataCompleted(this, new ObjectDataEventArgs
            {
                Data = DoCollect()
            });

        }

        #endregion

        #region MyRegion


        /// <summary>
        /// 	等待获取结果,如果没有取到结果则等待
        /// </summary>
        public Object DoCollect()
        {
            if (!IsCollectState(Key))
            {
                ForReady(Key);
            }

            //当没有取到数据（DATA），一直做循环
            while (Data == null)
            {

#if DEBUG
                var value = Dict[Key] == null ? "为NULL" : (String.IsNullOrEmpty((String)Dict[Key]) ? "为空字符" : Dict[Key]);
                Console.WriteLine("IsReadyCollect Dick[" + Key + "]=" + value);
#endif
                //数据已经完成装载等待接收
                if (IsReadyCollect(Key))
                {
                    Data = GetData(Key);
                }
            }
            return Data;
        }

        /// <summary>
        ///     线程创建，需要保存Key，成为待接受状态
        /// </summary>
        /// <param name="key"></param>
        public static void ForReady(String key)
        {
            Dict.Add(key, null);
        }

        /// <summary>
        ///     清空，等待下次接收
        /// </summary>
        /// <param name="key"></param>
        public static void ForDestory(String key)
        {
            Dict.Remove(key);
        }

        /// <summary>
        ///     根据KEY是否存在来判定，Client状态是否为待接收状态
        /// </summary>
        /// <returns><c>true</c> 待接收状态 <c>false</c> 无状态 </returns>
        /// <param name="key">Key.</param>
        public static bool IsCollectState(String key)
        {
            return Dict.ContainsKey(key);
        }

        /// <summary>
        ///	验证其值是否存在，如果存在则数据已经传递完成，可以交给Client接收
        /// </summary>
        /// <returns><c>true</c>设值完成<c>false</c>占无设值</returns>
        /// <param name="key">Key.</param>
        public static bool IsReadyCollect(String key)
        {
            return Dict.Any(m => m.Key == key && m.Value != null);
        }

        /// <summary>
        ///     设值，数据发送方通过线程调用，保证线程安全
        /// </summary>
        public void SetResult()
        {
            //有没有KEY也要完成数据库或状态持久化逻辑（永久）

            //如果KEY存在，表示已经有Client请求数据
            if (IsCollectState(Key))
            {
                Dict[Key] = Data;
            }
        }

        /// <summary>
        ///     取值.Dict清空，未下次Client请求准备环境
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public Object GetData(String key)
        {
            var data = Dict[key];
            ForDestory(key);
            return data;
        }

        //接收数据
        //A线程处理：商户接收数据

        //A线程与B线程交互：静态变量

        //返回处理结果
        //B线程处理：

        //删除Key：用户没有等待，或者线程结束

        #endregion


    }

    public class ObjectDataEventArgs : EventArgs
    {

        public Object Data;

    }





}
